
输入数字，按enter键后下面显示转换值：
<input type="text" id="ip1" onkeyup="caculate(this)" />
<div>结果：<p id="result"></p></div>
<div>验算：<p id="checkCalculationDom"></p></div>
<pre>
为什么十进制转二进制小数要乘2: https://zhidao.baidu.com/question/143763224.html
    因为从二进制到10进制是每位乘以一个权值
    比如
    101.101=1*2^2+0*2^1+1*2^0+ 1*2^-1 +0*2^-2 + 1*2^-3
    =4+0+1+0.5+0+0.125=5.625;
    同样,从10进制到2进制也就是
    5.625
    整数部分 5/2=2 5%2=1, 2/2=1,2%2=0,1/2=0,1%2=1;所以5=101B
    小数部分 0.625*2=1.25取整,得1,再取小数0.25*2=0.50取整得0,再用0.50*2=1.0取整得1
    所以小数据部分就得101.
    综上计算过程,你应该能看懂为什么要*2吧
    其根本原因就是 10进制和2进制转换是靠 2的权值进行的
</pre>
<h3>上面的解答我（施天助）自己为小白进一步直观阐述下原理：</h3>
<pre>
 搞懂这个就知道64进制要怎么算小数部分了：（为何*2取整就可以得到二进制小数，我们用二进制表示法列出十进制的数，再走一遍*2取整规则看看）
    由于0.625=1*2^-1 + 0*2^-2 + 1*2^-3，等式右边每乘2取整就能脱掉一位小数，我们走一遍：
    第1步： (1*2^-1 + 0*2^-2 + 1*2^-3)*2 = 1 + 0*2^-1 + 1*2^-2 ，注意每项都上升2次方了， 取整1，剩下 0*2^-1 + 1*2^-2
        tip：取整小技巧：只要考虑第一项的整数，因为从第二项开始后面还有2的-n次方，没有到整数呢，其实那些是更小的位上的数，很显然都比第一项要小且越来越小）
    第2步：（0*2^-1 + 1*2^-2）*2 = 0 + 1*2^-1， 注意第二项的取整是0，剩下 1*2^-1
    第3步：1*2^-1 * 2 = 1 至此再没有小数部分能取，结束。
    整合： 刚才1-3步取到 101就是0.625的二进制小数了。 这证明0.625经过同样的乘2取整的3步能得到小数，原理就是每乘2就是把其二进制表示的一个项“冒泡”出来，直到没有小数部分为止
</pre>
<pre>偶尔发现64进制转来转去要比较长才会丢精度，如： 125.70123456789012345 转一遍后得 125.70123456789013 能精确到小数点后14位！</pre>
<script>
// 系数
// const SIGNS = '01' // 2进制
// const SIGNS = '0123456789abcdef' // 16进制
const SIGNS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-+' // 2进制
function string10to64(number, precision) {
    let integer, decimal;
    if (number.indexOf('.')>-1) {
        let sp = number.split('.')
        // 注： +'000' 也 = 0
        integer = +sp[0], decimal = +sp[1]
        if ((integer || integer === 0) && (decimal || decimal === 0)) {
            return integer10to64(integer) + '.' + decimal10to64(+('0.' + sp[1]), precision)
        } else {
            return -1
        }
    } else {
        if(!+number){
            return -1
        }
        return integer10to64(+number)
    }
}
function integer10to64(qutient) {
    if (qutient===0) return 0
    let chars = SIGNS.split(''),
        radix = chars.length,
        arr = [];
    do {
        mod = qutient % radix;
        qutient = (qutient - mod) / radix;
        arr.unshift(chars[mod]);
    } while (qutient);
    return arr.join('');
}
function integer64to10(number_code) {
    if (number_code===0) return 0
    var chars = SIGNS,
        radix = chars.length,
        number_code = String(number_code),
        len = number_code.length,
        i = 0,
        origin_number = 0;
    while (i < len) {
        origin_number += Math.pow(radix, i++) * transSIGNS(number_code.charAt(len - i));
    }
    return origin_number;
}
function decimal10to64(qutient, precision) {
    if (qutient===0) return 0
    if (!precision) {
        precision = 3 // 默认精度为3
    }
    let chars = SIGNS.split(''),
        radix = chars.length,
        arr = [];
    do {
        qutient = qutient * radix
        mod = parseInt(qutient);
        // 取小数部分: 加减本身有精度问题不要用：
        // multiResult -= mod;
        let decimal = qutient.toString().split('.')[1]
        if(decimal){
            qutient = + ('0.' + decimal)
        }else{
            qutient=0
        }
        // 注意小数部分的运算是顺序拿整数，不像整数部分倒序拿余数。
        arr.push(chars[mod])
    } while (qutient && precision--);
    return arr.join('');
}
function checkCalculation(number) {
    let chars = SIGNS.split(''),
        radix = chars.length
    let integer, decimal;
    if (number.indexOf('.')>-1) {
        let sp = number.split('.')
        integer = sp[0] || '0', decimal = sp[1] || '0'
        if (integer && decimal) {
            let coefficient = sp[1].split(''), sum=0, index = -1
            for(let i=0; i<coefficient.length; i++){
                sum += transSIGNS(coefficient[i]) * Math.pow(radix,index--)
            }
            return integer64to10(integer) + sum
        }
    } else {
        return integer64to10(number)
    }
}
// 取十进制系数： 系数在第几位就是十进制的几
function transSIGNS(char) {
    return SIGNS.indexOf(char)
}
function caculate(dom) {
    if (event.keyCode==13) {
        let re = string10to64(dom.value, 10), resultDom = document.getElementById('result'), checkCalculationDom = document.getElementById('checkCalculationDom')
        if (re==-1) {
            resultDom.innerHTML='输入数字好吗'
        }else{
            resultDom.innerHTML=re
        }
        // 
        checkCalculationDom.innerHTML=checkCalculation(re)
    }
}
</script>